//
// Created by baka on 2025/9/24.
//

#ifndef STM32F407IGT6_UART_PRINTF_H
#define STM32F407IGT6_UART_PRINTF_H

#define UART_NORMAL

#ifdef UART_NORMAL
typedef enum
{
    DEBUG_LEVEL_NONE = 0,  // 不输出任何调试信息
    DEBUG_LEVEL_ERROR,     // 输出错误信息
    DEBUG_LEVEL_WARNING,   // 输出警告信息
    DEBUG_LEVEL_INFO,      // 输出普通信息
    DEBUG_LEVEL_DEBUG,     // 输出调试信息
    DEBUG_LEVEL_VERBOSE    // 输出详细信息
} DebugLevel;

void debug_printf(DebugLevel level, const char *format, ...);

void cout(DebugLevel level, const char *format, ...);
/********推荐使用*********/
#define ERROR(format, ...) cout(DEBUG_LEVEL_ERROR, format, ##__VA_ARGS__)
#define WARNING(format, ...) cout(DEBUG_LEVEL_WARNING, format, ##__VA_ARGS__)
#define INFO(format, ...) cout(DEBUG_LEVEL_INFO, format, ##__VA_ARGS__)
#define P_DEBUG(format, ...) cout(DEBUG_LEVEL_DEBUG, format, ##__VA_ARGS__)
#define VERBOSE(format, ...) cout(DEBUG_LEVEL_VERBOSE, format, ##__VA_ARGS__)
/********推荐使用*********/



#endif


#ifdef UART_DMA
extern StreamBufferHandle_t  DMAPrintfStreamBuffer;
void DMAPrintfTaskInit(void);


//可以不启动任务直接使用这个函数
void DMA_printf(const char *format, ...);


typedef enum
{
    DEBUG_LEVEL_NONE = 0,  // 不输出任何调试信息
    DEBUG_LEVEL_ERROR,     // 输出错误信息
    DEBUG_LEVEL_WARNING,   // 输出警告信息
    DEBUG_LEVEL_INFO,      // 输出普通信息
    DEBUG_LEVEL_DEBUG,     // 输出调试信息
    DEBUG_LEVEL_VERBOSE    // 输出详细信息
} DebugLevel_DMA;

void debug_printf_DMA(DebugLevel_DMA level, const char *format, ...);

#endif

#endif //STM32F407IGT6_UART_PRINTF_H